import wtforms
from wtforms.validators import Email, Length, EqualTo,InputRequired
from models import UserModel, EmailCaptchaModel


# Form：主要用来验证前端提交的数据是否符合要求
class RegisterForm(wtforms.Form):
    # email是字符串类型，使用StringField
    # 指定验证器validators：里面包含各种已内置的验证，message是提示错误信息
    email = wtforms.StringField(validators=[Email(message="邮箱格式错误")])
    captcha = wtforms.StringField(validators=[Length(min=4, max=4, message="验证码格式错误")])
    username = wtforms.StringField(validators=[Length(min=3, max=20, message="用户名格式错误")])
    password = wtforms.StringField(validators=[Length(min=6, max=20, message="密码格式错误")])
    password_confirm = wtforms.StringField(validators=[EqualTo("password")])

    # 自定义验证
    # 1. 邮箱是否已被注册 2. 验证码是否正确
    def validate_email(self, field):
        # 传入的数据赋值给email
        email = field.data
        # 查找数据库中email值等于传入的field.data的数据，返回第一个找到的数据对象
        user = UserModel.query.filter_by(email=email).first()
        # 如果user对象存在，不存在则什么事都不发生
        if user:
            raise wtforms.ValidationError(message="该邮箱已被注册")

    def validate_captcha(self, field):
        captcha = field.data
        # self表示当前这个对象
        email = self.email.data
        # 到验证码的数据库中找同时满足两条信息的数据，如果有则返回第一个
        captcha_model = EmailCaptchaModel.query.filter_by(email=email, captcha=captcha).first()
        # 若未找到该对象
        if not captcha_model:
            raise wtforms.ValidationError(message="邮箱或验证码错误")
        # TODO：可以删掉captcha_model，但是如果每次都删除，会影响性能，可以在数据库中多加一条used管理是否使用过，定期删除使用过的即可


class LoginForm(wtforms.Form):
    # 可以返回的值一定要写在主体中，方法中只做验证
    email = wtforms.StringField(validators=[Email(message="邮箱格式错误")])
    password = wtforms.StringField(validators=[Length(min=6, max=20, message="密码格式错误")])

class QuestionForm(wtforms.Form):
    title = wtforms.StringField(validators=[Length(min = 3,max = 100,message="标题格式错误")])
    content = wtforms.StringField(validators=[Length(min = 3,message="内容格式错误")])

class AnswerForm(wtforms.Form):
    content = wtforms.StringField(validators=[Length(min = 3,message="内容格式错误")])
    question_id = wtforms.IntegerField(validators=[InputRequired(message="必须传入问题id")])